package com.zsyh.jiujiu;

import android.app.Application;
import android.content.Context;
import android.util.Log;

import androidx.multidex.MultiDex;

import com.allen.library.RxHttpUtils;
import com.allen.library.config.OkHttpConfig;
import com.allen.library.cookie.store.SPCookieStore;
import com.allen.library.interfaces.BuildHeadersListener;
import com.blankj.utilcode.util.AppUtils;
import com.example.zyh.toolslib.BuildConfig;
import com.example.zyh.toolslib.utils.MediaLoader;
import com.example.zyh.toolslib.utils.SPUtils;
import com.hyphenate.chat.EMOptions;

import com.hyphenate.easeui.EaseUI;
import com.hyphenate.easeui.domain.EaseAvatarOptions;
import com.hyphenate.push.EMPushConfig;
import com.lwb.retrofit.RetrofitTask;
import com.scwang.smartrefresh.layout.SmartRefreshLayout;
import com.scwang.smartrefresh.layout.api.DefaultRefreshFooterCreator;
import com.scwang.smartrefresh.layout.api.DefaultRefreshHeaderCreator;
import com.scwang.smartrefresh.layout.api.RefreshFooter;
import com.scwang.smartrefresh.layout.api.RefreshHeader;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.footer.ClassicsFooter;
import com.scwang.smartrefresh.layout.header.ClassicsHeader;
import com.umeng.commonsdk.UMConfigure;
import com.umeng.socialize.PlatformConfig;
import com.xuexiang.xupdate.XUpdate;
import com.xuexiang.xupdate.entity.UpdateError;
import com.xuexiang.xupdate.listener.OnUpdateFailureListener;
import com.yanzhenjie.album.Album;
import com.yanzhenjie.album.AlbumConfig;
import com.zsyh.jiujiu.conference.chat.UserActivityLifecycleCallbacks;
import com.zsyh.jiujiu.net.OKHttpUpdateHttpService;

import java.util.HashMap;
import java.util.Map;

import okhttp3.OkHttpClient;

import static com.xuexiang.xupdate.entity.UpdateError.ERROR.CHECK_NO_NEW_VERSION;


/**
 * 2020/3/3
 * 描述：
 */
public class MyApplication extends Application {
    public static Context mContext;
    private volatile static MyApplication singleton;
    private static MyApplication mApp;
    private UserActivityLifecycleCallbacks mLifecycleCallbacks = new UserActivityLifecycleCallbacks();


    //刷新加载，static 代码段可以防止内存泄露
    static {
        //设置全局的Header构建器
        SmartRefreshLayout.setDefaultRefreshHeaderCreator(new DefaultRefreshHeaderCreator() {
            @Override
            public RefreshHeader createRefreshHeader(Context context, RefreshLayout layout) {
                layout.setDisableContentWhenRefresh(false);
                return new ClassicsHeader(context);//.setTimeFormat(new DynamicTimeFormat("更新于 %s"));//指定为经典Header，默认是 贝塞尔雷达Header
            }
        });
        //设置全局的Footer构建器
        SmartRefreshLayout.setDefaultRefreshFooterCreator(new DefaultRefreshFooterCreator() {
            @Override
            public RefreshFooter createRefreshFooter(Context context, RefreshLayout layout) {
                //不满一屏不允许加载更多
                layout.setEnableLoadMoreWhenContentNotFull(false);
                //加载时禁止操作
                layout.setDisableContentWhenLoading(false);
                //指定为经典Footer，默认是 BallPulseFooter
                return new ClassicsFooter(context);
            }
        });

    }


    @Override
    public void onCreate() {
        super.onCreate();
        singleton = this;
        mApp = this;
        //配置数据库
        mContext = getApplicationContext();
        initUpdate();
        initOkHttp();
        initHm();
        UMConfigure.setLogEnabled(true);//输出友盟日志
        UMConfigure.init(this,"5fdaf7b9dd2891533922236f", "umeng", UMConfigure.DEVICE_TYPE_PHONE, "");
        PlatformConfig.setWeixin("wx1c1e7482e347fe25", " 44d0b22a145c6577d7e922620c19e58f");
        PlatformConfig.setQQZone("101908561","ceb084d3ec0d1681032f697c95d94ffb");
        PlatformConfig.setQQFileProvider("com.tencent.sample2.fileprovider");
    }

    @Override
    protected void attachBaseContext(Context base) {
        super.attachBaseContext(base);
        MultiDex.install(this);
    }

    public static MyApplication getInstance() {
        if (singleton == null) {
            synchronized (MyApplication.class) {
                if (singleton == null) {
                    singleton = new MyApplication();
                }
            }
        }
        return singleton;
    }

    public static Context getContext() {
        return mContext;
    }


    private void initOkHttp() {
        OkHttpClient okHttpClient = new OkHttpConfig
                .Builder(this)
                //全局的请求头信息
                .setHeaders(new BuildHeadersListener() {
                    @Override
                    public Map<String, String> buildHeaders() {
                        HashMap<String, String> hashMap = new HashMap<>();
                        hashMap.put("appVersion", BuildConfig.VERSION_NAME);
                        hashMap.put("client", "android");
                        hashMap.put("Authorization", SPUtils.getString(mContext, "token", ""));
                        return hashMap;
                    }
                })
                //开启缓存策略(默认false)
                //1、在有网络的时候，先去读缓存，缓存时间到了，再去访问网络获取数据；
                //2、在没有网络的时候，去读缓存中的数据。
                .setCache(false)
                .setHasNetCacheTime(10)//默认有网络时候缓存60秒
                .setNoNetCacheTime(3600)//默认有网络时候缓存3600秒
                //全局持久话cookie,保存到内存（new MemoryCookieStore()）或者保存到本地（new SPCookieStore(this)）
                //不设置的话，默认不对cookie做处理
                .setCookieType(new SPCookieStore(this))
                //可以添加自己的拦截器(比如使用自己熟悉三方的缓存库等等)
                //.setAddInterceptor(null)
                //全局ssl证书认证
                //1、信任所有证书,不安全有风险（默认信任所有证书）
                //.setSslSocketFactory()
                //2、使用预埋证书，校验服务端证书（自签名证书）
                //.setSslSocketFactory(cerInputStream)
                //3、使用bks证书和密码管理客户端证书（双向认证），使用预埋证书，校验服务端证书（自签名证书）
                //.setSslSocketFactory(bksInputStream,"123456",cerInputStream)
                //全局超时配置
                .setReadTimeout(10)
                //全局超时配置
                .setWriteTimeout(10)
                //全局超时配置
                .setConnectTimeout(10)
                //全局是否打开请求log日志
                .setDebug(true)
                .build();



        RetrofitTask.getInstance()
                .init(this)
                .config()
                .setBaseUrl("http://99.zongshengsc.com/")
//                .setBaseUrl("http://192.168.2.188:8089/")
                .setOkClient(okHttpClient);




    }

    private void initHm() {


        EMPushConfig.Builder builder = new EMPushConfig.Builder(this);
        builder
//                .enableVivoPush() // 推送证书相关信息配置在AndroidManifest.xml中
//                .enableMeiZuPush(String appId, String appKey)
                //.enableMiPush("2882303761518530748", "5901853023748")
//                .enableOppoPush(String appKey, String appSecret)
                .enableHWPush(); //开发者需要调用该方法来开启华为推送
//                .enableFCM(String senderId); //开发者需要调用该方法来开启FCM推送

        EMOptions options = new EMOptions();
        options.setPushConfig(builder.build());
        EaseAvatarOptions easeAvatarOptions=new EaseAvatarOptions();
        easeAvatarOptions.setAvatarShape(1);
        EaseUI.getInstance().setAvatarOptions(easeAvatarOptions);
        EaseUI.getInstance().init(this, options);
        DemoHelper.getInstance().init(mContext);
//        EMClient.getInstance().setDebugMode(true);
        // 请确保环信SDK相关方法运行在主进程，子进程不会初始化环信SDK（该逻辑在EaseUI.java中）
//        if (EaseUI.getInstance().isMainProcess(this)) {
//
//            EMPushHelper.getInstance().setPushListener(new PushListener() {
//                @Override
//                public void onError(EMPushType pushType, long errorCode) {
//                    // TODO: 返回的errorCode仅9xx为环信内部错误，可从EMError中查询，其他错误请根据pushType去相应第三方推送网站查询。
//                    EMLog.e("PushClient", "Push client occur a error: " + pushType + " - " + errorCode);
//                }
//            });
//        }
    }


    private void registerActivityLifecycleCallbacks() {
        this.registerActivityLifecycleCallbacks(mLifecycleCallbacks);
    }

    public UserActivityLifecycleCallbacks getLifecycleCallbacks() {
        return mLifecycleCallbacks;
    }


    private void initUpdate() {
        XUpdate.get()
                .debug(true)
                .isWifiOnly(false)                                               //默认设置只在wifi下检查版本更新
                .isGet(false)                                                    //默认设置使用get请求检查版本
                .isAutoMode(false)                                              //默认设置非自动模式，可根据具体使用配置
                //.param("version", initLocalVersion())  //设置默认公共请求参数
                .param("id", "1")
                .setOnUpdateFailureListener(new OnUpdateFailureListener() { //设置版本更新出错的监听
                    @Override
                    public void onFailure(UpdateError error) {
                        error.printStackTrace();
                        if (error.getCode() != CHECK_NO_NEW_VERSION) {          //对不同错误进行处理
                            Log.e("updata",error.toString()+"");
                            //ToastUtils.show(error.toString());
                        }
                    }
                })
                .supportSilentInstall(false)                                     //设置是否支持静默安装，默认是true
                .setIUpdateHttpService(new OKHttpUpdateHttpService())           //这个必须设置！实现网络请求功能。
                .init(this);                                          //这个必须初始化

    }
}
